/** 下载一个 URL.createObjectURL 的文件
 * @param {string} url - 要下载的 url
 * @param {string} filename - 保存的文件名
 */
function _export(url, filename) {
  const link = document.createElement('a');
  link.href = url;
  link.download = filename;
  link.click();
}

/** 下载一个 url 的文件
 * @param {string} url - 要下载的 url
 * @param {string} [filename] - 保存的文件名
 */
export function download(url, filename) {
  if (!filename)
    filename = filename.substring(filename.lastIndexOf('/') + 1);
  var req = new XMLHttpRequest();
  req.onreadystatechange = function () {
    if (req.readyState == 4 && req.status == 200)
      _export(URL.createObjectURL(req.response))
  }
  req.open("GET", url, true);
  req.responseType = "blob";
  req.send();
}

/** 导出(下载)指定内容
 * @param {string | Blob | MediaSource} content - 要导出的文本或 Blob 对象，后期待扩展图片，视频等其它格式的内容
 * @param {string} filename - 保存的文件名
 */
export function exportContent(content, filename) {
  let blob = content;
  if (content?.constructor == String)
    blob = new Blob([content], { type: 'text/plain' });
  const url = URL.createObjectURL(blob);
  _export(url, filename);
  URL.revokeObjectURL(url);
}

/** 导入文件
 * @param {function(FileList)} onfilelist - 导入的文件列表的回调
 * @param {{multiple: 'multiple' | undefined, accept: string, name: string}} [config] - <input type="file" /> 的 attrs
 */
function _import(onfilelist, config) {
  const fileInput = document.createElement('input');
  fileInput.type = 'file';
  if (config)
    for (const key in config)
      fileInput[key] = config[key];

  fileInput.addEventListener('change', function (event) {
    const file = event.target.files[0];
    const reader = new FileReader();

    reader.onload = function (e) {
      const content = e.target.result;
      const jsonObject = JSON.parse(content);
      ondata?.(jsonObject);
    };

    reader.readAsText(file);
  });

  fileInput.click();
}

/** 上传文件
 * @param {string} url - 上传文件的接口 url，接口一般是上传单个文件，返回上传后文件的标识
 * @param {{multiple: 'multiple' | undefined, accept: string, name: string}} [config] - <input type="file" /> 的 attrs
 */
export function upload(url, config) {

}

/** 导入 json 格式的文件
 * @param {function(any | any[])} ondata - 从 json 格式读取到的 js 对象
 * @param {{multiple: 'multiple' | undefined, accept: string, name: string}} [config] - <input type="file" /> 的 attrs
 */
export function importJson(ondata, config) {
  const fileInput = document.createElement('input');
  fileInput.type = 'file';
  if (config)
    for (const key in config)
      fileInput[key] = config[key];

  fileInput.addEventListener('change', function (event) {
    console.log('files', event.target.files)
    const file = event.target.files[0];
    const reader = new FileReader();

    reader.onload = function (e) {
      const content = e.target.result;
      const jsonObject = JSON.parse(content);
      ondata?.(jsonObject);
    };

    reader.readAsText(file);
  });

  fileInput.click();
}